package com.code.platform.common.utils;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Created by frank on 15-1-14.
 */
public class ClassUtils {
    /**
     * 返回列表日志信息
     *
     * @param listResult
     *
     * @return
     */
    public static String getListLogInfo(List<?> listResult) {
        return getListLogInfo(listResult, 5);
    }

    /**
     * 取得对象的日志输出信息
     *
     * @param obj
     *
     * @return
     */
    public static String getObjectLogInfo(Object obj) {
        // 空返回值情况
        if (obj == null) {
            return "null";
        }

        // 字符串返回值情况
        if (obj instanceof String) {
            return "\"" + obj + "\"";
        }

        // 列表返回值情况
        if (obj instanceof List<?>) {
            return getListLogInfo(((List<?>) obj));
        }

        // 映射返回值情况
        if (obj instanceof Map<?, ?>) {
            return getMapLogInfo(((Map<?, ?>) obj), 5);
        }

        // 其他情况
        return getOjectFieldLog(obj);
    }

    /**
     * 打印出object 有Get方法 的属性值
     *
     * @param obj
     *
     * @return
     */
    public static String getOjectFieldLog(Object obj) {
        if (obj == null) return null;
        Field[] fields = obj.getClass().getDeclaredFields();// 获得属性
        StringBuilder sb = new StringBuilder();
        sb.append("{" + obj.getClass().getSimpleName());
        try {

            for (Field field : fields) {
//				if(field.getType() == String.class){
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), obj.getClass());
                Method readMethod = pd.getReadMethod();// 获得get方法
                if (readMethod != null) {
                    sb.append("(" + field.getName() + "=");
                    Object o = readMethod.invoke(obj);
                    sb.append(o + ")");
                }
//				}
            }
        } catch (Exception e) {
            return obj.toString();
        }
        sb.append("}");
        return sb.toString();

    }

    /**
     * 返回列表日志信息
     *
     * @param listResult
     * @param maxListLogItem 列表输出数量
     *
     * @return
     */
    public static String getListLogInfo(List<?> listResult, int maxListLogItem) {
        if (listResult == null) {
            return "null";
        }

        int i = 0;
        StringBuffer buf = new StringBuffer("{List(size=" + listResult.size() + "):");
        Iterator<?> iterator = null;
        for (iterator = listResult.iterator(); iterator.hasNext() && i < maxListLogItem; ) {
            buf.append((i++ > 0 ? "," : "") + getOjectFieldLog(iterator.next()) + "");
        }
        if (iterator.hasNext()) {
            buf.append(",...}");
        } else {
            buf.append("}");
        }

        return buf.toString();
    }

    /**
     * 返回列表日志信息
     *
     * @param listResult
     * @param maxListLogItem 列表输出数量
     *
     * @return
     */
    public static String getMapLogInfo(Map<?, ?> listResult, int maxListLogItem) {
        if (listResult == null) {
            return "null";
        }

        int i = 0;
        StringBuffer buf = new StringBuffer("{Map(size=" + listResult.size() + "):");
        Iterator<?> iterator = null;
        for (iterator = listResult.entrySet().iterator(); iterator.hasNext() && i < maxListLogItem; ) {
            buf.append((i++ > 0 ? "," : "") + getOjectFieldLog(iterator.next()) + "");
        }
        if (iterator.hasNext()) {
            buf.append(",...}");
        } else {
            buf.append("}");
        }

        return buf.toString();
    }
}
